package com.study.cn.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
import lombok.SneakyThrows;

import java.lang.reflect.Field;

/**
 * @Author: lss
 * @Date: 2022/1/18 16:09
 */
@Data
public class DemoReflect {

    @Excel(name = "id")
    private Integer id;
    @Excel(name = "姓名")
    private String name;
    @Excel(name = "地址")
    private String site;

    @Override
    public String toString() {
        return "DemoReflect{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", site='" + site + '\'' +
                '}';
    }

    /**
     * 属性少时直接使用if判断
     * @param args
     */

    @SneakyThrows
    public static void main(String[] args) {
        DemoReflect demoReflect = new DemoReflect();
        // 反射创建对象
        Class<? extends DemoReflect> aClass = demoReflect.getClass();
        /**
         * 使用getDeclaredFields 或者 getFields 获取对象属性或者类
         * 区别：getFields获取对象中public的属性且包含继承类的 不包含其他private，protected
         * getDeclaredFields包含所有的属性，但是不会获取继承类的属性
         */
        Field[] declaredFields = aClass.getDeclaredFields();  //获取对象属性数组
        // declaredFields 是对象内的属性合集
        for (int i = 0; i < declaredFields.length; i++) {
            Field field = declaredFields[i];
            // 获取属性名
            String name = field.getName();
            /**
             * set()方法第一个参数为你想为哪个对象存储的,后面的参数为值，field是对象属性
             * 举个栗子：常规操作是 对象.set属性(属性值) ,Field是: 属性名.set(对象, 属性值)
             */
            if ("id".equals(name)){
                field.set(demoReflect,1);
            }else if ("name".equals(name)){
                field.set(demoReflect,"lss");
            }else if ("site".equals(name)){
                field.set(demoReflect,"hb");
            }
        }
        System.out.println("常规反射对象赋值: "+demoReflect.toString());
    }

}
